package com.tuhui.config;

import com.rabbitmq.client.Channel;
import com.tuhui.util.ConstantUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.util.FileCopyUtils;
import sun.misc.BASE64Decoder;

import java.io.*;
import java.nio.file.Files;
import java.util.Map;

@Component
@RabbitListener(queues="hello")
@Slf4j
public class CustomerConf {
       //监听器监听指定的Queue
    @RabbitHandler
    public void process2(Map map, Channel channel, Message message) throws Exception{
        try {
            BASE64Decoder decoder = new BASE64Decoder();// 建立解码类实例
            byte[] contentArray = decoder.decodeBuffer(map.get("file").toString());// 解码生成byte数组
            File newFile = new File(map.get("path").toString());
            if(!newFile.getParentFile().exists()){
                newFile.getParentFile().mkdirs();
            }
            if(!newFile.exists()){
                newFile.createNewFile();
            }
            FileCopyUtils.copy(contentArray,newFile);
            //告诉服务器收到这条消息已经被当前消费者消费了，可以在队列安全删除，这样后面就不会再重发了，
            //否则消息服务器以为这条消息没处理掉，后续还会再发
            //第二个参数是消息的标识，false只确认当前一个消息收到，true确认所有consumer获得的消息
            //channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
            log.info("消费信息成功消费的文件是：{}",map.get("path").toString());
        } catch (Exception e) {
            //错误超过三次就不放回队列了，应为放回队列也消费不成功导致消息阻塞
            if(ConstantUtil.FileErrorMap.get(map.get("path").toString())==null || ConstantUtil.FileErrorMap.get(map.get("path").toString()).equals("")){
                 ConstantUtil.FileErrorMap.put(map.get("path").toString(),1);
                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false,true);
                log.error("error:消费信息失败，消费的文件是：{},错误信息:{},消费了{}次",map.get("path").toString(),e,1);
            }else if((Integer)ConstantUtil.FileErrorMap.get(map.get("path").toString())>=3){
                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false,false);
                //移除这个错误记录
                log.error("error:消费信息失败，消费的文件是：{},错误信息:{},消费了{}次都不成功将不再消费",map.get("path").toString(),e,ConstantUtil.FileErrorMap.get(map.get("path").toString()));
                ConstantUtil.FileErrorMap.remove(map.get("path").toString());
            }else{
                Integer i = (Integer) ConstantUtil.FileErrorMap.get(map.get("path").toString())+1;
                ConstantUtil.FileErrorMap.put(map.get("path").toString(),i);
                channel.basicNack(message.getMessageProperties().getDeliveryTag(), false,true);
                log.error("error:消费信息失败，消费的文件是：{},错误信息:{},消费了{}次",map.get("path").toString(),e,ConstantUtil.FileErrorMap.get(map.get("path").toString()));
            }
            log.error("error:消费信息失败，消费的文件是：{},错误信息:{}",map.get("path").toString(),e);
        }
    }
}
